import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
import seaborn as sns
from matplotlib.font_manager import FontProperties
import matplotlib as mpl

# 创建数据框
data = {
    '债券简称': ['G21苏林1', 'G21综能1', 'G21华新1', 'G21华新2', '21北电', 'PR文1A1', 'PR文1A2',
                 'PR文1B', 'GC华能04', 'GC太科01', '21昆明轨道', 'G苏天2优', 'G苏天2次'],
    '计划发行规模（亿）': [2.0000, 10.0000, 10.0000, 10.0000, 5.0000, 2.5200, 2.8000,
                         0.9800, 20.0000, 1.0000, 10.0000, 10.1200, 0.5300],
    '发行金额上限（亿）': [2.0000, 10.0000, 10.0000, 10.0000, np.nan, np.nan, np.nan,
                         np.nan, 20.0000, 1.0000, 15.0000, np.nan, np.nan],
    '债券评级': [np.nan, 'AA+', 'AAA', 'AAA', np.nan, 'AAA', 'AAA', 'AA+', 'AAA', 'AA', 'AAA', 'AAA', np.nan]
}

df = pd.DataFrame(data)

# 设置全局字体
plt.rcParams['font.sans-serif'] = ['SimHei']    # SimHei 字体就是黑体
plt.rcParams['axes.unicode_minus'] = False     #解决保存图像是负号'-'显示为方块的问题

# 判断是否存在缺失值
has_missing_values = df.isnull().values.any()
print("是否存在缺失值：", has_missing_values)

# 处理缺失值
df.fillna(value={'发行金额上限（亿）': 0, '债券评级': '未评级'}, inplace=True)

# 数据特征分析
print("数据特征分析：")
print(df.describe())

# 数据异常值处理和箱线图
plt.figure(figsize=(8, 6))
sns.boxplot(data=df[['计划发行规模（亿）', '发行金额上限（亿）']])
plt.title("数据异常值处理 - 箱线图")
plt.show()

# 标准化处理
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df[['计划发行规模（亿）', '发行金额上限（亿）']])
scaled_df = pd.DataFrame(scaled_data, columns=['计划发行规模（亿）', '发行金额上限（亿）'])
print("标准化处理后的数据：")
print(scaled_df)

# 相关性分析
correlation_matrix = df[['计划发行规模（亿）', '发行金额上限（亿）']].corr()
print("相关性分析：")
print(correlation_matrix)

# 使用散点图展示债券发行规模与发行金额上限之间的关系
plt.figure(figsize=(8, 6))
sns.scatterplot(x='计划发行规模（亿）', y='发行金额上限（亿）', data=df)
plt.title("债券发行规模与发行金额上限关系")
plt.xlabel("计划发行规模（亿）")
plt.ylabel("发行金额上限（亿）")
plt.show()

# 统计债券评级的分布并绘制条形图
plt.figure(figsize=(8, 6))
sns.countplot(x='债券评级', data=df)
plt.title("债券评级分布")
plt.xlabel("债券评级")
plt.ylabel("数量")
plt.show()

# 绘制特征之间的相关性热力图
plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title("特征相关性热力图")
plt.show()

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 准备特征和目标变量
X = df[['计划发行规模（亿）']]
y = df['发行金额上限（亿）']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 建立线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估模型
mse = mean_squared_error(y_test, y_pred)
print("均方误差 (MSE):", mse)

# 可视化预测结果
plt.figure(figsize=(8, 6))
plt.scatter(X_test, y_test, color='blue', label='实际值')
plt.plot(X_test, y_pred, color='red', linewidth=2, label='预测值')
plt.title('债券发行金额上限预测')
plt.xlabel('计划发行规模（亿）')
plt.ylabel('发行金额上限（亿）')
plt.legend()
plt.show()
